<?php

require_once APPLICATION_PATH . '/forms/NuevaOrdenDeServicio.php';
require_once APPLICATION_PATH . '/forms/Mensaje.php';
require_once APPLICATION_PATH . '/models/Single/OrdenDeServicioEntity.php';
require_once APPLICATION_PATH . '/forms/BuscarOrdenDeServicio.php';

class ServicioController extends Zend_Controller_Action
{

    public function init()
    {
        $this->initView();
        $this->_flashMessenger = $this->_helper->FlashMessenger;
        $this->view->baseUrl = $this->_request->getBaseUrl();
        $this->view->messages = $this->_flashMessenger;
    }

    public function indexAction()
    {
        $this->_redirect('/servicio/consultar');
    }

    public function consultarAction()
    {
        if (!$this->haySesion()){
            $this->_redirect('/usuario/login');
        }
        try {
            $this->view->title = "Listado de Ordenes de Servicio";

            $urlCriterio = $this->_request->getParam('criterio', null);
            $urlABuscar = $this->_request->getParam('mostrar', null);

            $isUser = false;

            $enProceso = $this->getEstado('En Proceso');
            $this->view->enProceso = $enProceso->getPK();

            // si hay que realizar una busqueda
            if ($urlCriterio !== null && $urlABuscar !== null){
                $criterio = urldecode($urlCriterio);
                $aBuscar = urldecode($urlABuscar);

                $localidadesModel = new Spalm_Model_Single_OrdenDeServicioEntity();
                $select = $localidadesModel->getMapper()->getDbTable()->select();

                switch ($criterio) {
                    case 'descripcionEquipos' :
                        $aBuscar = '%' . $aBuscar . '%';
                        $select->where('descripcion_equipos LIKE ?',$aBuscar);
                        break;
                    case 'fallasInformadas' :
                        $aBuscar = '%' . $aBuscar . '%';
                        $select->where('detalle_fallas_informadas LIKE ?',$aBuscar);
                        break;
                    case 'serviciosRealizados' :
                        $aBuscar = '%' . $aBuscar . '%';
                        $select->where('servicios_realizados LIKE ?',$aBuscar);
                        break;
                    case 'cliente' :
                        $clienteModel = new Spalm_Model_Single_ClienteEntity();
                        $consultaCliente = $clienteModel->getMapper()->getDbtable()->select();
                        $consultaCliente->where('razon_social = ?',$aBuscar);

                        $resultado = $clienteModel->fetchAll($consultaCliente);

                        if (count($resultado) == 0){
                            $this->mostrarMensaje('Error', 'El cliente no existe');
                        }

                        $cliente = current($resultado);

                        $select->where('cliente_id = ?',$cliente->getPK());
                        break;
                    case 'estado' :
                        $estadosModel = new Spalm_Model_Single_EstadoOrdenDeServicioEntity();
                        $consultaEstado = $estadosModel->getMapper()->getDbtable()->select();
                        $consultaEstado->where('nombre = ?',$aBuscar);

                        $resultado = $estadosModel->fetchAll($consultaEstado);

                        if (count($resultado) == 0){
                            $this->mostrarMensaje('Error', 'El estado no existe');
                        }

                        $estado = current($resultado);

                        $select->where('estado_id = ?',$estado->getPK());
                        break;
                    case 'usuario' :
                        $usuariosModel = new Spalm_Model_Single_UsuarioEntity();
                        $consultaUsuario = $usuariosModel->getMapper()->getDbtable()->select();
                        $consultaUsuario->where('login_name = ?',$aBuscar);

                        $resultado = $usuariosModel->fetchAll($consultaUsuario);

                        if (count($resultado) == 0){
                            $this->mostrarMensaje('Error', 'El usuario no existe');
                        }

                        $usuario = current($resultado);

                        $uposModel = new Spalm_Model_Single_UsuarioPorOrdenDeServicioEntity();
                        $consultaUPOS = $uposModel->getMapper()->getDbtable()->select();
                        $consultaUPOS->where('usuario_id = ?',$usuario->getPK());

                        $res = $uposModel->fetchAll($consultaUPOS);

                        $listaOrdenes = array();
                        foreach ($res as $ordenesKey) {
                            $listaOrdenes[] = $ordenesKey->getOrdenDeServicio();
                        }

                        $isUser = true;
                        break;
                }
            }
            else { // si no, recuperar todo
                $select = null;
            }

            if ($isUser){
                $this->view->ordenes = $listaOrdenes;
            }
            else {
                $ordenModel = new Spalm_Model_Single_OrdenDeServicioEntity();
                $this->view->ordenes = $ordenModel->fetchAll($select);
            }

            

        }
        catch (Exception $e){
            $this->mostrarMensaje('Error', $e->getMessage());
        }
    }

    public function nuevoAction()
    {
        if (!$this->haySesion()){
            $this->_redirect('/usuario/login');
        }

        $this->view->title = "Crear Orden de Servicio";
        $this->view->headTitle($this->view->title, 'PREPEND');

        $urlSeleccionado = $this->_request->getParam('seleccionado', null);

        if ($urlSeleccionado !== null){
            $seleccionado = (int) urldecode($urlSeleccionado);
        }
        else {
            $seleccionado = 0;
        }

        $listaClientes = $this->getClientes();

        if (count($listaClientes) == 0){
            $this->mostrarMensaje('Error', 'No hay clientes cargados en la base','cliente/nuevo');
        }

        $form = new Form_NuevaOrdenDeServicio($listaClientes,$seleccionado);

        $this->view->form = $form;

        if ($this->getRequest()->isPost()) {
            $formData = $this->getRequest()->getPost();
            if ($form->isValid($formData)) {
                try {
                    $estado = $this->getEstado('Pendiente');

                    $clientesModel = new Spalm_Model_Single_ClienteEntity();
                    $cliente = $clientesModel->find( (int) $form->getValue('clientes'));

                    $ordenDeServicio = new Spalm_Model_Single_OrdenDeServicioEntity();
                    $ordenDeServicio->setEstado($estado);
                    $ordenDeServicio->setDescripcionEquipos($form->getValue('descripcionEquipos'));
                    $ordenDeServicio->setDetalleFallasInformadas($form->getValue('fallasInformadas'));
                    $ordenDeServicio->setServiciosRealizados($form->getValue('serviciosRealizados'));
                    $ordenDeServicio->setCliente($cliente);

                    $ordenDeServicio->save();

                    $this->mostrarMensaje('Exito', 'La Orden de Servicio ha sido cargada con exito');
                }
                catch (Exception $e){
                    $this->mostrarMensaje('Error', $e->getMessage());
                }
            } else {
                $form->populate($formData);
            }
        }
    }

    public function editarAction()
    {
        try {
            if (!$this->haySesion()){
            $this->_redirect('/usuario/login');
        }

        $id = (int)$this->_request->getParam('id', 0);
        $this->view->title = "Actualizar Orden de Servicio";


        $ordenModel = new Spalm_Model_Single_OrdenDeServicioEntity();
        $ordenDeServicio = $ordenModel->find($id);

        $listaClientes = $this->getClientes();

        if (count($listaClientes) == 0){
            $this->mostrarMensaje('Error', 'No hay clientes cargados en la base');
        }

        $form = new Form_NuevaOrdenDeServicio($listaClientes,0,$ordenDeServicio);
        $this->view->form = $form;

        if (null === $ordenDeServicio) {
            $this->mostrarMensaje('Error', 'La Orden de Servicio no existe');
        }

        if ($this->_request->isPost())
        {
            $formData = $this->_request->getPost();
            if (!$form->isValid($formData)) {
                $form->populate($formData);
                return;
            }

            try {
                $sesion = new Zend_Session_Namespace('spalm');
                $usuario = $sesion->usuario;

                $estado = $this->getEstado('En Proceso');


                $tecnicos = $ordenDeServicio->getTecnicos();

                $nombreTecnicos = array();

                foreach ($tecnicos as $tecnicoActual) {
                    $nombreTecnicos[] = $tecnicoActual->getLoginName();
                }

                if (count($tecnicos) == 0 || !in_array($usuario->getLoginName(), $nombreTecnicos)){
                    $upos = new Spalm_Model_Single_UsuarioPorOrdenDeServicioEntity();
                    $upos->setUsuario($usuario);
                    $upos->setOrdenDeServicio($ordenDeServicio);
                    $upos->save();
                }


                $ordenDeServicio->setServiciosRealizados($form->getValue('serviciosRealizados'));
                $ordenDeServicio->setEstado($estado);
                $ordenDeServicio->save();

                $this->mostrarMensaje('Exito', 'La Orden de Servicio ha sido actualizada con exito');

            } catch (Exception $e) {
                $this->mostrarMensaje('Error', $e->getMessage());
            }
        }
        }
        catch (Exception $e){
            $this->mostrarMensaje('Error', $e->getMessage());
        }
    }

    public function mostrarAction()
    {

        if (!$this->haySesion()){
            $this->_redirect('/usuario/login');
        }

        $urlTitulo = $this->_request->getParam('titulo', null);

        $urlMensaje = $this->_request->getParam('mensaje', null);

        $urlDestino = $this->_request->getParam('destino', null);

        $titulo = urldecode($urlTitulo);

        $mensaje = urldecode($urlMensaje);

        $destinoTemp = urldecode($urlDestino);

        $partes = explode('-', $destinoTemp);

        $temp = implode('/', $partes);

        $this->view->title = $titulo;

        $form = new Form_Mensaje($mensaje);

        $this->view->form = $form;



        if ($this->_request->isPost())

        {

            $formData = $this->_request->getPost();

            if (!$form->isValid($formData)) {

                $form->populate($formData);

                return;

            }

            $destino = ($urlDestino === null) ? '/servicio/consultar' : $temp;

            $this->_redirect($destino);

        }
    }

    public function buscarAction()
    {
        if (!$this->haySesion()){
            $this->_redirect('/usuario/login');
        }

        $this->view->title = "Buscar Ordenes de Servicios";

        $form = new Form_BuscarOrdenDeServicio();
        $this->view->form = $form;

        if ($this->_request->isPost())
        {
            $formData = $this->_request->getPost();
            if (!$form->isValid($formData)) {
                $form->populate($formData);
                return;
            }

            $criterio = $form->getValue('criterio');
            $aBuscar = $form->getValue('buscado');

            $this->_redirect("/servicio/consultar/criterio/" . urlencode($criterio) . "/mostrar/" . urlencode($aBuscar));
        }
    }

    public function finalizarAction()
    {
        if (!$this->haySesion()){
            $this->_redirect('/usuario/login');
        }

        $id = (int)$this->_request->getParam('id', 0);
        $this->view->title = "Finalizar Orden de Servicio";

        try {
            // chequear que solo se este "en Proceso"
            $enProceso = $this->getEstado('En Proceso');

            $ordenModel = new Spalm_Model_Single_OrdenDeServicioEntity();
            $ordenDeServicio = $ordenModel->find($id);

            if ($ordenDeServicio === null){
                $this->mostrarMensaje('Error', 'La orden de servicio no existe');
            }

            if ($enProceso->getPK() != $ordenDeServicio->getEstado()->getPK()){
                $this->mostrarMensaje('Error', 'Operacion no permitida');
            }

            $estado = $this->getEstado('Finalizada');
          
            // realizar la accion
            $ordenDeServicio->setEstado($estado);
            $ordenDeServicio->save();

            $this->mostrarMensaje('Exito', 'La Orden de Servicio ha sido finalizada exitosamente');
        }
        catch (Exception $e){
            $this->mostrarMensaje('Error', $e->getMessage());
        }
    }


    private function getClientes() {
        // obtiene la lista de clientes
        $clientesModel = new Spalm_Model_Single_ClienteEntity();
        $clientes = $clientesModel->fetchAll();

        foreach ($clientes as $clienteActual) {
            $listaClientes[$clienteActual->getPK()] = $clienteActual->getRazonSocial();
        }

        return $listaClientes;
    }

    private function mostrarMensaje($tituloIn,$mensajeIn,$irA = null)
    {
        $titulo = urlencode($tituloIn);

        $mensaje = urlencode($mensajeIn);

        $redirigir = '/servicio/mostrar/titulo/' . $titulo . '/mensaje/' . $mensaje;

        if ($irA !== null){

            $partes = explode('/', $irA);

            $temp = implode('-', $partes);

            $destino = urlencode($temp);

            $redirigir .= '/destino/' . $destino;

        }

        $this->_redirect($redirigir);
    }

    private function haySesion() {
        $salida = false;

        if (Zend_Session::namespaceIsset('spalm')){
            $session = new Zend_Session_Namespace('spalm');

            $salida = (isset ($session->usuario));
        }

        return $salida;
    }

    private function getEstado($nombreEstado) {
        $estadoModel = new Spalm_Model_Single_EstadoOrdenDeServicioEntity();
        $consultaEstado = $estadoModel->getMapper()->getDbtable()->select();
        $consultaEstado->where('nombre = ?',$nombreEstado);
        $estados = $estadoModel->fetchAll($consultaEstado);

        if (count($estados) == 0){
            $this->mostrarMensaje('Error', 'Faltan estados en la base');
        }

        $estado = current($estados);

        return $estado;
    }

}













